Portada General

In [9]:
from PIL import Image
imagen = Image.open('Portada_2do_avance_PIA1.jpg')
imagen
Out[9]:

Tiroteos escolares USA 1990-2020

1.-Importar libreria y base de datos

In [10]:
import pandas as pd
import numpy as np
import json
In [11]:
df = pd.read_csv("pah_wikp_combo.csv", header=0, index_col=0, parse_dates=True, squeeze=True)

El csv. lo puse en la carpeta 7mo. Semestre, Mineria de datos, Etapa 3

In [12]:
df = pd.read_csv("pah_wikp_combo.csv",encoding='utf8')

2.- Visualización de datos

In [13]:
df.shape
Out[13]:
(695, 11)

En nuestra base de datos tenemos 11 columnas, con 695 renglones.

In [14]:
df.head()
Out[14]:
Date City State Latitud Longitud AreaType School Fatalitie Wounded Dupe Source
0 1990-03-27 Brooklyn New York 40.678177 -73.94416 NaN C 0 1.0 NaN Wikp
1 1990-05-20 Centerville Tenneesee 39.62748 -84.159019 1 HS 1 NaN NaN Pah
2 1990-08-26 Las Vegas Nevada 36.169941 -115.139832 2 HS 1 NaN NaN Pah
3 1990-09-11 San Antonio Texas 29.424122 -98.493629 NaN HS 0 3.0 NaN Wikp
4 1991-01-08 Richardson Texas 20.02556 -99.19556 2 HS 0 NaN NaN Pah

Nos muestras los datos de los "primeros" 5 renglones

In [15]:
df.tail()
Out[15]:
Date City State Latitud Longitud AreaType School Fatalitie Wounded Dupe Source
690 2020-01-14 Bellaire Texas 20.02556 -99.19556 NaN HS 1 0.0 NaN Wikp
691 2020-01-14 Fort Worth Texas 20.02556 -99.19556 NaN HS 0 2.0 NaN Wikp
692 2020-01-23 Oxnard California 37.25022 -119.7512600 NaN ES 0 1.0 NaN Wikp
693 2020-02-03 Commerce Texas 20.02556 -99.19556 NaN C 2 1.0 NaN Wikp
694 2020-09-16 Sonora California 37.25022 -119.7512600 NaN HS 1 0.0 NaN Wikp

Nos muestras los datos de los "ultimos" 5 renglones

In [16]:
df.columns
Out[16]:
Index(['Date', 'City', 'State', 'Latitud', 'Longitud', 'AreaType', 'School',
       'Fatalitie', 'Wounded', 'Dupe', 'Source'],
      dtype='object')

5.- Traducir el nombre de las columnas

In [17]:
df.columns = ['Fecha','Ciudad','Estado','Latitud','Longitud','Tipo_de_área','Escuela','Muertes','Heridos','True','Wikp_o_Pah']
df.columns
Out[17]:
Index(['Fecha', 'Ciudad', 'Estado', 'Latitud', 'Longitud', 'Tipo_de_área',
       'Escuela', 'Muertes', 'Heridos', 'True', 'Wikp_o_Pah'],
      dtype='object')
In [18]:
df
Out[18]:
Fecha Ciudad Estado Latitud Longitud Tipo_de_área Escuela Muertes Heridos True Wikp_o_Pah
0 1990-03-27 Brooklyn New York 40.678177 -73.94416 NaN C 0 1.0 NaN Wikp
1 1990-05-20 Centerville Tenneesee 39.62748 -84.159019 1 HS 1 NaN NaN Pah
2 1990-08-26 Las Vegas Nevada 36.169941 -115.139832 2 HS 1 NaN NaN Pah
3 1990-09-11 San Antonio Texas 29.424122 -98.493629 NaN HS 0 3.0 NaN Wikp
4 1991-01-08 Richardson Texas 20.02556 -99.19556 2 HS 0 NaN NaN Pah
... ... ... ... ... ... ... ... ... ... ... ...
690 2020-01-14 Bellaire Texas 20.02556 -99.19556 NaN HS 1 0.0 NaN Wikp
691 2020-01-14 Fort Worth Texas 20.02556 -99.19556 NaN HS 0 2.0 NaN Wikp
692 2020-01-23 Oxnard California 37.25022 -119.7512600 NaN ES 0 1.0 NaN Wikp
693 2020-02-03 Commerce Texas 20.02556 -99.19556 NaN C 2 1.0 NaN Wikp
694 2020-09-16 Sonora California 37.25022 -119.7512600 NaN HS 1 0.0 NaN Wikp

695 rows × 11 columns

En este caso no cambie el nombre de las columnas lo unico que hice fue traducirlas

In [19]:
df.dtypes
Out[19]:
Fecha            object
Ciudad           object
Estado           object
Latitud          object
Longitud         object
Tipo_de_área     object
Escuela          object
Muertes           int64
Heridos         float64
True             object
Wikp_o_Pah       object
dtype: object

Tipo de dato que contiene cada columna

Convierto los NaN a 0 o a "Sin descripción"

In [20]:
df['Heridos'].fillna(0,inplace=True)

Convierto los NaN de la Columna Heridos a 0

In [21]:
df['True'].fillna(0,inplace=True)

Convierto los NaN de la columna True a cero

3.- Descripción básica de las columnas

In [22]:
df
Out[22]:
Fecha Ciudad Estado Latitud Longitud Tipo_de_área Escuela Muertes Heridos True Wikp_o_Pah
0 1990-03-27 Brooklyn New York 40.678177 -73.94416 NaN C 0 1.0 0 Wikp
1 1990-05-20 Centerville Tenneesee 39.62748 -84.159019 1 HS 1 0.0 0 Pah
2 1990-08-26 Las Vegas Nevada 36.169941 -115.139832 2 HS 1 0.0 0 Pah
3 1990-09-11 San Antonio Texas 29.424122 -98.493629 NaN HS 0 3.0 0 Wikp
4 1991-01-08 Richardson Texas 20.02556 -99.19556 2 HS 0 0.0 0 Pah
... ... ... ... ... ... ... ... ... ... ... ...
690 2020-01-14 Bellaire Texas 20.02556 -99.19556 NaN HS 1 0.0 0 Wikp
691 2020-01-14 Fort Worth Texas 20.02556 -99.19556 NaN HS 0 2.0 0 Wikp
692 2020-01-23 Oxnard California 37.25022 -119.7512600 NaN ES 0 1.0 0 Wikp
693 2020-02-03 Commerce Texas 20.02556 -99.19556 NaN C 2 1.0 0 Wikp
694 2020-09-16 Sonora California 37.25022 -119.7512600 NaN HS 1 0.0 0 Wikp

695 rows × 11 columns

Fecha: Nos da la fecha por año-mes-día Ciudad: Nos menciona alguna ciudad del estado donde ocurrio el tiroteo Estado: Menciona uno de los 52 estados donde ocurrio el tiroteo Latitud y Longitud: Describen en que coordenada geografica ocurrio el tiroteo Tipo_de_área: Menciona urban=urbano, suburban=suburbano, 0=otro Escuela: C=universidad, HS=escuela secundaria, MS=escuela intermedia, ES=escuela primaria, -=desconocido Muertes: Cuantas personas fallecieron Heridos:Cuantas personas resultaron heridas True:Si solo ocurrio muertes y ningun herido Wikp_o_Pah: Pah:solo ocurrio muertes, Wikp:ocurrio muerte y heridos

6.- Agrupaciones

In [23]:
df.Escuela.unique()
Out[23]:
array(['C', 'HS', 'MS', 'ES', '-', nan], dtype=object)

Nos menciona las tipos de clases que estan en la columna Escuela

In [24]:
Escuelas_vs_fecha = df.loc[df.Escuela == 'C'].Fecha
Escuelas_vs_fecha
Out[24]:
0      1990-03-27
11     1991-11-01
12     1991-11-01
16     1991-12-12
17     1992-01-29
          ...    
653    2018-03-14
675    2019-04-30
676    2019-05-04
679    2019-05-07
693    2020-02-03
Name: Fecha, Length: 144, dtype: object

Nos dice cuantas veces ocurrio un tiroteo en C=Universidad, ademas de darnos la fecha cuando ocurrio

Datos nulos

In [25]:
df.isnull()
Out[25]:
Fecha Ciudad Estado Latitud Longitud Tipo_de_área Escuela Muertes Heridos True Wikp_o_Pah
0 False False False False False True False False False False False
1 False False False False False False False False False False False
2 False False False False False False False False False False False
3 False False False False False True False False False False False
4 False False False False False False False False False False False
... ... ... ... ... ... ... ... ... ... ... ...
690 False False False False False True False False False False False
691 False False False False False True False False False False False
692 False False False False False True False False False False False
693 False False False False False True False False False False False
694 False False False False False True False False False False False

695 rows × 11 columns

Aqui podemos ver que tenemos datos nulos en el "Tipo de área" por lo que debemos de corregir eso como lo hice anteriormente

In [26]:
df.isnull().any()
Out[26]:
Fecha           False
Ciudad          False
Estado          False
Latitud         False
Longitud        False
Tipo_de_área     True
Escuela          True
Muertes         False
Heridos         False
True            False
Wikp_o_Pah      False
dtype: bool

Me marca que tengo NaN en la columna "Tipo de área" y "Escuela" aunque en "Escuela" esta todo bien :s, no hay NaN

In [27]:
df['Tipo_de_área'].fillna(0,inplace=True)

Esta corregido la columna de "Tipo de área" quitando los NaN a cero

4.- Clasificación de datos

In [28]:
df['Total victimas']=df.loc[df['Muertes']>=0, ['Muertes','Heridos']].sum(axis=1)
df
Out[28]:
Fecha Ciudad Estado Latitud Longitud Tipo_de_área Escuela Muertes Heridos True Wikp_o_Pah Total victimas
0 1990-03-27 Brooklyn New York 40.678177 -73.94416 0 C 0 1.0 0 Wikp 1.0
1 1990-05-20 Centerville Tenneesee 39.62748 -84.159019 1 HS 1 0.0 0 Pah 1.0
2 1990-08-26 Las Vegas Nevada 36.169941 -115.139832 2 HS 1 0.0 0 Pah 1.0
3 1990-09-11 San Antonio Texas 29.424122 -98.493629 0 HS 0 3.0 0 Wikp 3.0
4 1991-01-08 Richardson Texas 20.02556 -99.19556 2 HS 0 0.0 0 Pah 0.0
... ... ... ... ... ... ... ... ... ... ... ... ...
690 2020-01-14 Bellaire Texas 20.02556 -99.19556 0 HS 1 0.0 0 Wikp 1.0
691 2020-01-14 Fort Worth Texas 20.02556 -99.19556 0 HS 0 2.0 0 Wikp 2.0
692 2020-01-23 Oxnard California 37.25022 -119.7512600 0 ES 0 1.0 0 Wikp 1.0
693 2020-02-03 Commerce Texas 20.02556 -99.19556 0 C 2 1.0 0 Wikp 3.0
694 2020-09-16 Sonora California 37.25022 -119.7512600 0 HS 1 0.0 0 Wikp 1.0

695 rows × 12 columns

Agregue la columna de Total de víctimas para poder hacer el gráfico de USA, solo sume la columna de Muertes y Heridos para obtener el total de personas que fueron victimas del tiroteo.

7.- Preguntas de interes

PREGUNTAS DE INTERES:

¿Para que me puede servir estas agrupaciones para la práctica siguiente? Me pueden servir para poder realizar graficas, en mi caso escogimos la columna de las escuelas de la universidad, por lo que al seleccionarla podemos realizar graficas, ¿como cuando ocurrieron tiroteos?, ademas de sus fechas correspondientes. Tambien podemos hacer una serie de tiempo, por lo que podemos utilizar la técnica de la predicción para saber cuantas personas pueden morir o el porcentaje de mortalidad que tiene los tiroteos en las universidades.

PARTE 2 Visualización de datos

Estadística Básica

In [29]:
df['Muertes'].sum()
Out[29]:
806

En nuestra base de datos, desde 1990 a 2020 han muertos 806 personas a causa de los tiroteos en EUA

In [30]:
df['Muertes'].mean()
Out[30]:
1.1597122302158274

1 persona a muerto por promedio desde 1990 a 2020, a causa de los tiroteos en EUA

In [31]:
df['Heridos'].cumsum()
Out[31]:
0        1.0
1        1.0
2        1.0
3        4.0
4        4.0
       ...  
690    605.0
691    607.0
692    608.0
693    609.0
694    609.0
Name: Heridos, Length: 695, dtype: float64

Tenemos un total de 609 heridos a causa de los tiroteos

In [32]:
df['Muertes'].min()
Out[32]:
0

El menor número de personas que han muerto en un tiroteo es de saldo blanco

In [33]:
df['Muertes'].max()
Out[33]:
33

El mayor número de personas que han muerto en un tiroteo es de 33 personas

In [34]:
df['Muertes'].median()
Out[34]:
1.0
In [35]:
df['Muertes'].var()
Out[35]:
7.434109427155685
In [36]:
df['Muertes'].std()
Out[36]:
2.7265563311906256
In [37]:
df.corr()
Out[37]:
Muertes Heridos Total victimas
Muertes 1.000000 0.359816 0.842698
Heridos 0.359816 1.000000 0.805543
Total victimas 0.842698 0.805543 1.000000
In [38]:
df.cov()
Out[38]:
Muertes Heridos Total victimas
Muertes 7.434109 2.430454 9.864564
Heridos 2.430454 6.137404 8.567858
Total victimas 9.864564 8.567858 18.432422

Al tener la correlación números muy cercanos a 1 y al ser la covarianza números grandes podemos concluir que existe una relación lineal muy grande entre el número de "muertes", el Total de vicitmas y el número de "heridos" en los tiroteos.

Serie de tiempo Tiroteos

In [39]:
import seaborn as sns
import matplotlib.pyplot as plt
import pylab as pl
In [41]:
df.plot(x='Fecha',y='Total victimas',figsize=(15,5))
df.Fecha=pd.to_datetime(df.Fecha)
df.set_index('Fecha')
plt.title('Serie de Tiempo de Tiroteos',color='black')
plt.tight_layout()
plt.xlabel("Fecha de los tiroteos")
plt.ylabel("Total de victimas")
plt._show()

NOTA: figsize=(valor x,valor y) df.Fecha=pd.to_datetime(df.Fecha) df.set_index('Fecha') df['Total victimas'].plot()

Como "Serie de Tiempo" usamos como variable x="Fecha" y como variable y="Total victimas".

Como nuestra gráfica es muy grande solo tomamos del año de 2016 a 2020 y a simple vista se ve que no sigue una tendencia, .*.La serie es Estacionaria en Media

Prueba de Dickey Fuller Aumentada

In [42]:
from statsmodels.tsa.stattools import adfuller
X = df['Total victimas'].values
result = adfuller(X)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
for key, value in result[4].items():
	print('\t%s: %.3f' % (key, value))
ADF Statistic: -17.123281
p-value: 0.000000
Critical Values:
	1%: -3.440
	5%: -2.866
	10%: -2.569

Prueba de Dickey Fuller Aumentada (Varianza), H0:La serie es no Estacionaria vs H1:La serie es Estacionaria, con un p-valor:0.00(muy pequeño)<alfa, .*.la serie es ESTACIONARIA en Varianza

.*. La serie de Tiempo "Tiroteos en EUA de 1990-2020" es una serie ESTACIONARIA por la media y varianza

In [43]:
Estado=df['Estado']
Muertes=df['Muertes']
Heridos=df['Heridos']
RL = pd.DataFrame({'Estado': Estado, 'Muertes': Muertes, 'Heridos': Heridos})
RL.head(690)
Out[43]:
Estado Muertes Heridos
0 New York 0 1.0
1 Tenneesee 1 0.0
2 Nevada 1 0.0
3 Texas 0 3.0
4 Texas 0 0.0
... ... ... ...
685 California 2 0.0
686 Wisconsin 0 1.0
687 Wisconsin 0 2.0
688 Florida 0 1.0
689 Texas 1 1.0

690 rows × 3 columns

Representación grafica-Scater plot

1.-Es representar los datos para poder intuir si existe una relación y cuantificar dicha relación mediante un coeficiente de correlación.

In [44]:
fig, ax = plt.subplots(figsize=(15, 6))

RL.plot(
    x    = 'Muertes',
    y    = 'Heridos',
    c    = 'firebrick',
    kind = "scatter",
    ax   = ax
)
ax.set_title('Distribución de Muertes y Heridos');

Esta grafica nos muestra que el número de "Heridos" y el número de "Muertes estan relacionados. Esto significa que entre menos heridos tengamos menos cantidad de muertes sucedera en un tiroteo escolar de EUA.

Predicción de 2021 a 2025

In [45]:
df_Prediccion = pd.read_csv("pah_wikp_combo_Prediccion.csv", header=0, index_col=0, parse_dates=True, squeeze=True)
In [46]:
df_Prediccion.plot(x='FechaVF',y='Predicción',figsize=(15,5))
df.Fecha=pd.to_datetime(df.Fecha)
df.set_index('Fecha')
plt.title('Predicción de Tiroteos 2021-2025',color='black')
plt.tight_layout()
plt.xlabel("Fecha de los tiroteos")
plt.ylabel("Total de victimas")
plt._show()

Usando "EXCEL" obtuve las predicciones para el año de 2021 a 2025.

Gráfica Estados Unidos

In [47]:
import plotly.graph_objects as go
import pandas as pd
In [48]:
df['Resumen'] ='Ciudad: ' + df['Ciudad'] + ', ' + 'Estado: ' + df['Estado'].astype(str)

fig = go.Figure(data=go.Scattergeo(
        lon = df['Longitud'],
        lat = df['Latitud'],
        text = df['Resumen'],
        mode = 'markers',
        marker_color = df['Total victimas'],
        ))

fig.update_layout(
        title = 'Tiroteos en EUA desde 1990-2020<br>(Coloque el cursor sobre el estado)',
        geo_scope='usa',
    )
fig.show()

Mapa de los Estados Unidos con Alaska, que cada punto representa la ubicación del estado donde se llevo a cabo un tiroteo desde el año de 1990-2020 Mapa de Estados Unidos

Agrego una columna nueva llamada "Resumen" la cual me dara la Latitud, Longitud, Ciudad y Estado, para que cuando yo solo de click en algun punto me muestre toda esa información.

In [49]:
df['Resumen1'] ='Ciudad: ' + df['Ciudad'] + ', ' + 'Estado: ' + df['Estado'] + ', ' + 'Total de victimas: ' + df['Total victimas'].astype(str)

fig = go.Figure(data=go.Scattergeo(
        locationmode = 'USA-states',
        lon = df['Longitud'],
        lat = df['Latitud'],
        text = df['Resumen1'],
        mode = 'markers',
        marker = dict(
            size = 8,
            opacity = 0.8,
            reversescale = True,
            autocolorscale = False,
            symbol = 'square',
            line = dict(
                width=1,
                color='rgba(102, 102, 102)'
            ),
            colorscale = 'Blues',
            cmin = 0,
            color = df['Total victimas'],
            cmax = df['Total victimas'].max(),
            colorbar_title="Total de victimas<br>1990-2020"
        )))

fig.update_layout(
        title = 'Tiroteos en EUA desde 1990-2020<br>(Coloque el cursor sobre el estado)',
        geo = dict(
            scope='usa',
            projection_type='albers usa',
            showland = True,
            landcolor = "rgb(250, 250, 250)",
            subunitcolor = "rgb(217, 217, 217)",
            countrycolor = "rgb(217, 217, 217)",
            countrywidth = 0.5,
            subunitwidth = 0.5
        ),
    )
fig.show()

Mapa de los Estados Unidos con Alaska, que cada punto representa la ubicación del estado donde se llevo a cabo un tiroteo, ademas de las victimas que resultaron afectadas desde 1990-2020

Gráfica de barras y categorícos

Gráfica de barras Total víctimas vs Estado

In [50]:
import plotly.express as px
Tiroteos_estados=df.Estado.value_counts().head(12).reset_index()
Tiroteos_estados.columns=['Estado','Total victimas']
In [51]:
figE = px.bar(Tiroteos_estados, x="Total victimas", y="Estado", orientation='h',color='Estado')
figE.show()

Nos presentan los primeros 12 estados, de los cuales al hacer click en cualquiera de ellos nos muestra el Total de victimas(a causa del tiroteo) que a llegado a tener dicho estado desde 1990-2020

Gráfica de barras Total víctimas vs Ciudad

In [52]:
Tiroteos_ciudades=df.Ciudad.value_counts().head(15).reset_index()
Tiroteos_ciudades.columns=['Ciudad','Total victimas']
figC = px.bar(Tiroteos_ciudades, x="Total victimas", y="Ciudad", orientation='h',color='Ciudad')
figC.show()

Nos presentan las primeras 15 ciudades, de los cuales al hacer click en cualquiera de ellas nos muestra el Total de victimas(a causa del tiroteo) que a llegado a tener dicha ciudad desde 1990-2020

Gráfica de Pastel Total víctimas vs Estado

In [53]:
import pandas as pd
from matplotlib.pyplot import pie, axis, show
%matplotlib inline
In [54]:
sums = df.groupby(df["Estado"])["Total victimas"].sum().head(12)
axis('equal');
pie(sums, labels=sums.index);
show()

Grafica de pastel

Decidimos utilizar la gráfica de pastel ya que nos ayuda a entender, el Total de víctimas que tiene cada estado a causas de los tiroteos, solo mostre 15 estados ya que al poner todos, la gráfica no es entendible.

Gráfica de Pastel Total víctimas vs Ciudad

In [55]:
sums = df.groupby(df["Ciudad"])["Total victimas"].sum().head(15)
axis('equal');
pie(sums, labels=sums.index);
show()

Mismo caso, solo que en vez de "Estados" maneje las "Ciudades", al igual solo mostre solo 15 ciudades, por que si hubiera puesto todas las ciudades no se entenderia bien el grafico.

Gráfica de barras Heridos vs Muertes en las Escuelas

In [66]:
Heridos_escuela_primaria=df[(df['Heridos']>=1)&(df['Escuela']=='ES')]
totalHES=len(Heridos_escuela_primaria)

Muertes_escuela_primaria=df[(df['Muertes']>=1)&(df['Escuela']=='ES')]
totalMES=len(Muertes_escuela_primaria)

Heridos_escuela_intermedia=df[(df['Heridos']>=1)&(df['Escuela']=='MS')]
totalHMS=len(Heridos_escuela_intermedia)

Muertes_escuela_intermedia=df[(df['Muertes']>=1)&(df['Escuela']=='MS')]
totalMMS=len(Muertes_escuela_intermedia)

Heridos_escuela_secundaria=df[(df['Heridos']>=1)&(df['Escuela']=='HS')]
totalHHS=len(Heridos_escuela_secundaria)

Muertes_escuela_secundaria=df[(df['Muertes']>=1)&(df['Escuela']=='HS')]
totalMHS=len(Muertes_escuela_secundaria)

Heridos_universidad=df[(df['Heridos']>=1)&(df['Escuela']=='C')]
totalHC=len(Heridos_universidad)

Muertes_universidad=df[(df['Muertes']>=1)&(df['Escuela']=='C')]
totalMC=len(Muertes_universidad)


Escuelas=['Escuela Primaria','Escuela intermedia','Secundaria-Preparatoria','Universidad']

fig = go.Figure()
fig.add_trace(go.Bar(x=Escuelas, y=[totalHES,totalHMS,totalHHS,totalHC],
                base=0,
                marker_color='blue',
                name='Heridos'))
fig.add_trace(go.Bar(x=Escuelas, y=[totalMES,totalMMS,totalMHS,totalMC],
                base=0,
                marker_color='red',
                name='Muertes'
                ))
fig.update_layout(title_text='Tiroteos por nivel académico')

fig.show()

Enfocandonos en la Escuela, se realizó una tabla comparando los 4 niveles educativos respecto a las Muertes y Heridos, que han ocurrido desde 1990 a 2020, dandonos entender que han ocurrido más tiroteos en las escuelas secundaria-preparatoria.

Gráfica de calor

In [68]:
df['Año'] = pd.DatetimeIndex(df['Fecha']).year

Tiroteos_anuales=df.Año.value_counts().reset_index()
Tiroteos_anuales.columns=['Año','Total victimas']


fig = px.scatter(Tiroteos_anuales, x="Año", y="Total victimas", size="Total victimas", color="Total victimas",
           hover_name="Total victimas", log_x=True, size_max=60)
fig.show()

Utilizando un grafico de calor, se comparo el Total de victimas vs Año, el total de victimas es grande si el color es claro e inversamente proporcional si el color es más fuerte entonces el total de victimas es más pequeño.

Seaborn

In [58]:
import seaborn as sns
import matplotlib.pyplot as plt
In [59]:
df.head()
Out[59]:
Fecha Ciudad Estado Latitud Longitud Tipo_de_área Escuela Muertes Heridos True Wikp_o_Pah Total victimas Resumen Resumen1 Año
0 1990-03-27 Brooklyn New York 40.678177 -73.94416 0 C 0 1.0 0 Wikp 1.0 Ciudad: Brooklyn, Estado: New York Ciudad: Brooklyn, Estado: New York, Total de v... 1990
1 1990-05-20 Centerville Tenneesee 39.62748 -84.159019 1 HS 1 0.0 0 Pah 1.0 Ciudad: Centerville, Estado: Tenneesee Ciudad: Centerville, Estado: Tenneesee, Total ... 1990
2 1990-08-26 Las Vegas Nevada 36.169941 -115.139832 2 HS 1 0.0 0 Pah 1.0 Ciudad: Las Vegas, Estado: Nevada Ciudad: Las Vegas, Estado: Nevada, Total de vi... 1990
3 1990-09-11 San Antonio Texas 29.424122 -98.493629 0 HS 0 3.0 0 Wikp 3.0 Ciudad: San Antonio, Estado: Texas Ciudad: San Antonio, Estado: Texas, Total de v... 1990
4 1991-01-08 Richardson Texas 20.02556 -99.19556 2 HS 0 0.0 0 Pah 0.0 Ciudad: Richardson, Estado: Texas Ciudad: Richardson, Estado: Texas, Total de vi... 1991
In [60]:
sns.pairplot(df[['Muertes', 'Heridos','Total victimas','Año']])
Out[60]:
<seaborn.axisgrid.PairGrid at 0x2043ef23790>

Se realizó el siguiente grafico de dispersión para ver si es que siguen un comportamiento, como se puede ver las "Muertes" con el número de "Heridos" esta muy relacionado.

Gráficas multivariantes

In [61]:
sns.lmplot(x='Muertes', y='Heridos', hue='Wikp_o_Pah', 
           data=df.loc[df['Wikp_o_Pah'].isin(['Wikp', 'Pah'])], 
           fit_reg=False)
Out[61]:
<seaborn.axisgrid.FacetGrid at 0x2043f6bf340>

Decidí tomar el Wikp_o_Pah, ya que me llamó la atención ver como ambas chocan y ocurre un Pah:solo ocurrio muertes o un Wikp:ocurrio muerte y heridos.

In [62]:
sns.lmplot(x='Muertes', y='Heridos', hue='Escuela', 
           data=df.loc[df['Escuela'].isin(['C', 'HS','MS','ES','-'])], 
           fit_reg=False)
Out[62]:
<seaborn.axisgrid.FacetGrid at 0x2043f98aa90>

En esta gráfica multivariante decidi tomar la Escuela, ya que me interesa saber a que nivel educativo suelen haber mas "Muertes" y "Heridos a causa del tiroteo en EUA, por lo que la Escuela se divide en: C=universidad, HS=escuela secundaria, MS=escuela intermedia, ES=escuela primaria, -=desconocido

Mapa de correlación

In [63]:
f,ax=plt.subplots(figsize = (9,9))
sns.heatmap(df.corr(),annot= True,linewidths=0.5,fmt = ".1f",ax=ax)
plt.xticks(rotation=90)
plt.yticks(rotation=0)
plt.title('Mapa de correlación')
plt.savefig('graph.png')
plt.show()

Criterio de Cohen (1998), nos dice que entre: 0.1-0.3 efecto pequeño, 0.3-0.5 efecto mediano y >=0.5 efecto grande

Como podemos observar la correlación es muy buena para Muertes-Heridos, Muertes-Total victimas, Heridos-Total victimas. Sin embargo nosotros usamos Año-Total victimas, ya que nos interesa saber como se comporta esta serie de tiempo, a simple vista se ve que tienen una correlación muy pequeña 0.1 eso nos quiere decir que tiene una débil tendencia o habra mas dispersión en la nube de puntos

Histograma Wikp o Pah vs Muertes-Heridos

In [64]:
W = plt.hist(df[df["Wikp_o_Pah"] == "Wikp"].Muertes,bins=30,fc = (1,0,0,0.5),label = "Wikp",orientation='horizontal')
P = plt.hist(df[df["Wikp_o_Pah"] == "Pah"].Muertes,bins=30,fc = (0,1,0,0.5),label = "Pah",orientation='horizontal')
plt.legend()
plt.xlabel("Frecuencia")
plt.ylabel("Número de muertos")
plt.title("Histograma")
plt.show()
In [65]:
W = plt.hist(df[df["Wikp_o_Pah"] == "Wikp"].Heridos,bins=30,fc = (1,0,0,0.5),label = "Wikp",orientation='horizontal')
P = plt.hist(df[df["Wikp_o_Pah"] == "Pah"].Heridos,bins=30,fc = (0,1,0,0.5),label = "Pah",orientation='horizontal')
plt.legend()
plt.xlabel("Frecuencia")
plt.ylabel("Número de heridos")
plt.title("Histograma")
plt.show()

Utilice la columna "Wikp o Pah" vs Muertes-Heridos, ya que nos interesa saber con que Frecuencia suelen ocurrir, Pah:solo ocurrio muertes, Wikp:ocurrio muerte y heridos

Conclusión general

Dada nuestra base de datos modificada pudimos comprender que varios de nuestros objetivos se pueden cumplir.

Como primer punto nuestro objetivo principal es determinar el impacto, que el tiroteo en las escuelas pueda llegar a generar en el futuro de EUA se pudo ver gracias a la gráfica de serie de tiempo la cual nos muestra los años vs total de víctimas ya que con ayuda de la estadística pudimos realizar diversas pruebas para poder obtener las predicciones, para los años de 2021-2025, sin embargo al tener una correlación muy pequeña entre los años y el total de víctimas esto hace que tengamos una débil tendencia o haya más dispersión en la nube de puntos. Lo cual significa que debemos de encontrar otras pruebas para obtener mejores predicciones y así poder ver el comportamiento que llegaran a tener los tiroteos en las escuelas de EUA.

Finalmente, nuestro objetivo secundario se cumplió, por que la gráfica del mapa de EUA nos muestra los Estados donde han ocurrido los tiroteos, además de apoyarnos con la gráfica de barras de Total de víctimas vs Estado y Total de víctimas vs Ciudad. Esto lo podemos mejorar mas investigando de manera descriptiva el por que esos estados o ciudad suelen ocurrir más tiroteos.

Opcional-Cambiar datos por números__

Solo realice esto para que se pudiera ver mejor la última gráfica

In [77]:
import pandas as pd
import numpy as np
import json
In [78]:
dfModificado = pd.read_csv("Pah_whikp_modificado.csv")
In [79]:
dfModificado.columns = ['Fecha','Ciudad','Estado','Latitud','Longitud','Tipo_de_área','Escuela','Muertes','Heridos','True','Wikp_o_Pah','Descripción']
In [80]:
dfModificado0= dfModificado.fillna(0)
In [81]:
dfModificado0['Total victimas']=dfModificado0.loc[dfModificado0['Muertes']>=0, ['Muertes','Heridos']].sum(axis=1)
In [82]:
dfModificado0.drop(['Descripción'], axis=1)
Out[82]:
Fecha Ciudad Estado Latitud Longitud Tipo_de_área Escuela Muertes Heridos True Wikp_o_Pah Total victimas
0 3/27/90 Brooklyn New York 40.6643 -73.9385 0 1.0 0 1.0 0.0 0 1.0
1 5/20/90 1enterville Tenn4see 35.75035 -86.25027 1 2.0 1 0.0 0.0 1 1.0
2 8/26/90 Las Vegas Nevada 39.25021 -116.75119 2 2.0 1 0.0 0.0 1 1.0
3 09/11/1990 San Antonio Texas 20.02556 -99.19556 0 2.0 0 3.0 0.0 0 3.0
4 01/08/1991 Ri1hardson Texas 20.02556 -99.19556 2 2.0 0 0.0 0.0 1 0.0
... ... ... ... ... ... ... ... ... ... ... ... ...
690 1/14/20 Bellaire Texas 20.02556 -99.19556 0 2.0 1 0.0 0.0 0 1.0
691 1/14/20 Fort Worth Texas 20.02556 -99.19556 0 2.0 0 2.0 0.0 0 2.0
692 1/23/20 Oxnard 1alifornia 37.25022 -119.7512600 0 4.0 0 1.0 0.0 0 1.0
693 02/03/2020 1ommer1e Texas 20.02556 -99.19556 0 1.0 2 1.0 0.0 0 3.0
694 9/16/20 Sonora 1alifornia 37.25022 -119.7512600 0 2.0 1 0.0 0.0 0 1.0

695 rows × 12 columns

Pequeño experimento para ver el comportamiento, ya que antes de esta base de datos solo teniamos dos columnas con números enteros, ahora para las columnas "Tipo de área", "True" y "Wikp o Pah", de texto pasaron a datos númericos.

Tipo de area: otro tipo=0, subbarn=1, urban=2 Escuela: C=Universidad=1, HS=Escuela secundaria=2, MS=Escuela intermedia=3, ES=Escuela primaria=4, -=desconocido=5 TRUE: Falso=0, Verdadero=1 Wikp o Pah: Wikp=0, Pah=1

In [83]:
import seaborn as sns
import matplotlib.pyplot as plt
In [84]:
f,ax=plt.subplots(figsize = (15,15))
sns.heatmap(dfModificado0.corr(),annot= True,linewidths=0.5,fmt = ".1f",ax=ax)
plt.xticks(rotation=90)
plt.yticks(rotation=0)
plt.title('Mapa de correlación')
plt.savefig('graph.png')
plt.show()